package VideoJuego;

/**
 * Se encarga de actualizar y dibujar el juego
 *
 * Desarrolladores:
 * Equipo: The Dream Team
 *  @author José Francisco Ruiz Martínez 	A01166298
 *  @author José Héctor Bermúdez Robles		A01161142
 *  @author Arturo Ramírez Morales		A01165819
 *  @version 1.0 Octubre 2010
 */
public class AnimadorJuego implements Runnable
{
    private Videojuego juego;        // Juego debería ser una interface
    private boolean corriendo;
    private Thread thread;
    private static final int FPS = 50;
    /**
     * Muestra el retardo que tiene el animador entre actualizar y dibujar el juego
     */
    public static final int RETARDO = 1000/FPS;

    /**
     * Este metodo recibe y asigna sobre qué se va a correr el thread
     * @param juego el objeto en el que se quiere correr el thread
     */
    public AnimadorJuego(Videojuego juego) {

        this.juego = juego;
    }

    /**
     * Inicia al thread para que comience a actualizar y dibujar
     */
    public void iniciar() {

        thread = new Thread(this);
        thread.start();     // Llama al método run()
    }

    /**
     * Actualiza y dibuja el videojuego
     */
    public void run() {

        corriendo = true;

        while ( corriendo ) {

            long ini = System.currentTimeMillis();
            // Indicarle al juego que actualice a todos los objetos (posicion)
            juego.actualizar();
            juego.dibujar();
            long fin = System.currentTimeMillis();

            try {
                if ( RETARDO - (fin-ini) >= 0 ) // Para evitar valores negativos
                    Thread.sleep(RETARDO - (fin-ini));
            } catch (InterruptedException ex) { }

            }
    }

    /**
     * Detiene el proceso de actualizar y dibujar el videojuego
     */
    public void terminar() {
        corriendo = false;
        thread.interrupt();
    }
}
